package model

import (
	"encoding/json"
	"os"

	"git.pyer.club/kingecg/gohttpd/utils"
	"git.pyer.club/kingecg/gologger"
)

type HttpPath struct {
	Path       string   `json:"path"`
	Root       string   `json:"root"`
	Default    string   `json:"default"`
	Upstreams  []string `json:"upstreams"`
	Directives string   `json:"directives"`
}

type HeaderValueConst string

const (
	ProxyHost HeaderValueConst = "$ProxyHost"
)

type HttpServerConfig struct {
	Name       string `json:"name"`
	ServerName string `json:"server"`
	Port       int    `json:"port"`
	Host       string `json:"host"`
	Paths      []HttpPath
	Username   string   `json:"username"`
	Password   string   `json:"password"`
	CertFile   string   `json:"certfile"`
	KeyFile    string   `json:"keyfile"`
	Directives []string `json:"directives"`
}

type GoHttpdConfig struct {
	Logging gologger.LoggersConfig `json:"logging"`
	Admin   *HttpServerConfig      `json:"admin"`
	Servers []*HttpServerConfig    `json:"servers"`
}

var DefaultAdminConfig HttpServerConfig = HttpServerConfig{
	ServerName: "admin",
	Port:       8080,
}

var Config GoHttpdConfig = GoHttpdConfig{}

func GetConfig() *GoHttpdConfig {
	return &Config
}

func SetServerConfig(c *HttpServerConfig) error {
	l := gologger.GetLogger("model")
	updated := false
	for i, s := range Config.Servers {
		if s.Name == c.Name {
			Config.Servers[i] = c
			updated = true
			break
		}
	}
	if !updated {
		Config.Servers = append(Config.Servers, c)
	}
	configFile := utils.NormalizePath("./config.json")
	configsStr, err := json.Marshal(Config)
	if err != nil {
		l.Error("Save config error:", err)
		return err
	}
	werr := os.WriteFile(configFile, configsStr, 0644)
	if werr != nil {
		l.Error("Save config error:", werr)
		return werr
	}
	return nil
}

func GetServerConfig(name string) *HttpServerConfig {
	for _, s := range Config.Servers {
		if s.Name == name {
			return s
		}
	}
	return nil
}
